home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / snip0493.zip / DAYNUM.C < prev    next >
C/C++ Source or Header  |  1993-04-05  |  2KB  |  94 lines

  1. /*
  2. **  DAYNUM.C - Functions to return statistics about a given date.
  3. **
  4. **  public domain by Bob Stout - uses Ray Gardner's SCALDATE.C
  5. */
  6.  
  7. int isleap (unsigned yr);
  8. long ymd_to_scalar (unsigned yr, unsigned mo, unsigned day);
  9. static long jan1date;
  10.  
  11. /*
  12. **  Define ISO to be 1 for ISO (Mon-Sun) calendars
  13. **
  14. **  ISO defines the first week with 4 or more days in it to be week #1.
  15. */
  16.  
  17. #ifndef ISO
  18.  #define ISO 0
  19. #endif
  20.  
  21. #if (ISO != 0 && ISO != 1)
  22.  #error ISO must be set to either 0 or 1
  23. #endif
  24.  
  25. /*
  26. **  Determine if a given date is valid
  27. */
  28.  
  29. int valiDate(unsigned yr, unsigned mo, unsigned day)
  30. {
  31.       unsigned int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  32.  
  33.       if (1 > mo || 12 < mo)
  34.             return 0;
  35.       if (1 > day || day > (days[mo - 1] + (2 == mo && isleap(yr))))
  36.             return 0;
  37.       else  return 1;
  38. }
  39.  
  40. /*
  41. **  Return the day of the year (1 - 365/6)
  42. */
  43.  
  44. int daynum(int year, int month, int day)
  45. {
  46.       jan1date = ymd_to_scalar(year, 1, 1);
  47.       return (int)(ymd_to_scalar(year, month, day) - jan1date + 1L);
  48. }
  49.  
  50. /*
  51. **  Return the week of the year (1 - 52)
  52. */
  53.  
  54. int weeknum(int year, int month, int day)
  55. {
  56.       int wn, j1n, dn = daynum(year, month, day);
  57.  
  58.       dn += (j1n = (int)((jan1date - (long)ISO) % 7L)) - 1;
  59.       wn = dn / 7;
  60.       if (ISO)
  61.             wn += (j1n < 4);
  62.       else  ++wn;
  63.       return wn;
  64. }
  65.  
  66. #ifdef TEST
  67.  
  68. #include <stdio.h>
  69. #include <stdlib.h>
  70.  
  71. void do_err(void);
  72.  
  73. void main(int argc, char *argv[])
  74. {
  75.       int day, month, year;
  76.  
  77.       if (4 > argc)
  78.       {
  79.             puts("Usage: DAYNUM month day year");
  80.             return;
  81.       }
  82.  
  83.       month = atoi(argv[1]);
  84.       day   = atoi(argv[2]);
  85.       year  = atoi(argv[3]);
  86.       if (100 > year)
  87.             year += 1900;
  88.  
  89.       printf("%d/%d/%d is day #%d in week %d\n", month, day, year,
  90.             daynum(year, month, day), weeknum(year, month, day));
  91. }
  92.  
  93. #endif /* TEST */
  94.